/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "acolitoinforme.h"
#include "ui_acolitoinforme.h"

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDate>

AcolitoInforme::AcolitoInforme(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AcolitoInforme)
{
    ui->setupUi(this);
    setup();
}

AcolitoInforme::~AcolitoInforme()
{
    delete ui;
}

void AcolitoInforme::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void AcolitoInforme::setup()
{
    conexion=false;
    this->repoActividades= new ReporteActividades(this);
    this->repoBebidas=new ReporteBebidas(this);
    setConectado(true);
    connect(ui->infoTiposButton,SIGNAL(clicked()),this->repoActividades,SLOT(reportePorTipos()));
    connect(ui->infoSalasButton,SIGNAL(clicked()),this->repoActividades,SLOT(reportePorSalas()));
    connect(ui->infoDiasButton,SIGNAL(clicked()),this->repoActividades,SLOT(reportePorDias()));
    connect(ui->infoAsociacionesButton,SIGNAL(clicked()),this->repoActividades,SLOT(reportePorAsociaciones()));

    connect(ui->infoProductosButton,SIGNAL(clicked()),this->repoBebidas,SLOT(reportePorProductos()));
    connect(ui->infoVentasButton,SIGNAL(clicked()),this->repoBebidas,SLOT(reportePorVentas()));
    connect(ui->infoPalesButton,SIGNAL(clicked()),this->repoBebidas,SLOT(reportePalesAbiertos()));
}

void AcolitoInforme::setConectado(bool estado)
{
    switch(estado)
    {
    case true:
        this->datosEvento();
        this->evaluaAsistentes();
        this->evaluaAlojamiento();
        this->evaluaActividades();
        this->evaluaBebidas();
        break;
    case false:
        break;
    default:
        break;
    }
    conexion=estado;
}

bool AcolitoInforme::isConectado() const
{
    return conexion;
}

void AcolitoInforme::evaluaAsistentes()
{
    int numTotalAsis,numTotalGrupos,numTotalAloj;
    int numTotalPendientes,numPagos,numImpagos;
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        //Calcula el numero total de asistentes

        query.exec("SELECT count(*) FROM asistente");
        query.first();
        numTotalAsis=query.value(0).toInt();

        query.clear();

        //Calcula el numero total de grupos

        query.exec("SELECT count(*) FROM grupo");
        query.first();
        numTotalGrupos=query.value(0).toInt();

        query.clear();

        //Calcula el numero total de alojados

        query.exec("SELECT sum(tamGrupo) FROM grupo WHERE IDgrupo IN (SELECT IDgrupo FROM asignado_a WHERE codHab != 'Sin asignar')");

        query.first();
        numTotalAloj=query.value(0).toInt();

        query.clear();

        //Calcula el numero total de pendientes de alojar

        query.exec("SELECT sum(tamGrupo) FROM grupo WHERE IDgrupo NOT IN (SELECT IDgrupo FROM asignado_a WHERE codHab!='Sin asignar'");

        query.first();
        numTotalPendientes=query.value(0).toInt();

        query.clear();

        //Calcula el numero total de pagos realizados

        query.exec("SELECT count(*) FROM asistente where haPagado=1");
        query.first();
        numPagos=query.value(0).toInt();

        query.clear();

        //Calcula el numero total de impagos

        query.exec("SELECT count(*) FROM asistente where haPagado=0");

        query.first();
        numImpagos=query.value(0).toInt();

        query.clear();    
    }

    ui->labelAsistente1->setText(ui->labelAsistente1->text().arg(numTotalAsis).arg(numTotalGrupos));
    ui->labelAsisAlojados->setText(ui->labelAsisAlojados->text().arg(numTotalAloj));
    ui->labelAsisPendientes->setText(ui->labelAsisPendientes->text().arg(numTotalPendientes));
    ui->labelAsisPagos->setText(ui->labelAsisPagos->text().arg(numPagos));
}

void AcolitoInforme::evaluaAlojamiento()
{
    int totalAlojamiento,totalZonas;
    int totalPlazas,plazasLibres,plazasOcupadas;

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        //Calcula el total de alojamientos
        query.exec("SELECT count(*) FROM habitacion");

        query.first();
        totalAlojamiento=query.value(0).toInt();

        query.clear();

        //Calcula el total de zonas
        query.exec("select count(*) from (select distinct localizacion from habitacion)");

        query.first();
        totalZonas=query.value(0).toInt();

        query.clear();

        //Calcula el total de plazas
        query.exec("select sum(maxPlazas) from habitacion");

        query.first();
        totalPlazas=query.value(0).toInt();

        query.clear();

        //Calcula el total de plazas libres
        query.exec("select sum(plazasLibres) from habitacion");

        query.first();
        plazasLibres=query.value(0).toInt();

        query.clear();

        //Calcula el total de plazas ocupadas
        plazasOcupadas=totalPlazas-plazasLibres;
    }

    ui->labelAlojamiento1->setText(ui->labelAlojamiento1->text().arg(totalAlojamiento).arg(totalZonas).arg(totalPlazas).arg(plazasLibres).arg(plazasOcupadas));

    ui->labelAlojDisponible->setText(ui->labelAlojDisponible->text().arg(plazasLibres));
    ui->labelAlojOcupado->setText(ui->labelAlojOcupado->text().arg(plazasOcupadas));

}

void AcolitoInforme::evaluaActividades()
{
    int numActividades;
    int numTipos,numSalas,numDias,numAsociaciones;

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        //Calcular numero de actividades
        query.exec("SELECT count(*) from actividad");

        query.first();
        numActividades=query.value(0).toInt();

        query.clear();

        //Calcular numero de tipos de actividad distintos
        query.exec("SELECT count(*) from tipoActividad");

        query.first();
        numTipos=query.value(0).toInt();

        query.clear();

        //Calcular numero de salas
        query.exec("SELECT count(*) from lugar");

        query.first();
        numSalas=query.value(0).toInt();

        query.clear();

        //Calcular numero de asociaciones
        query.exec("select count(*) from (select distinct asociacion from actividad);");

        query.first();
        numAsociaciones=query.value(0).toInt();

        query.clear();

        //Calcular numero de dias
        query.exec("SELECT inicio,fin FROM evento");

        query.first();

        QDate inicio,fin;
        inicio=query.value(0).toDate();
        fin=query.value(1).toDate();

        numDias=inicio.daysTo(fin)+1;

    }

    ui->labelActividades1->setText(ui->labelActividades1->text().arg(numActividades).arg(numTipos).arg(numSalas).arg(numDias).arg(numAsociaciones));
    ui->labelActActividades->setText(ui->labelActActividades->text().arg(numActividades));
    ui->labelActTipos->setText(ui->labelActTipos->text().arg(numTipos));
    ui->labelActSalas->setText(ui->labelActSalas->text().arg(numSalas));
    ui->labelActDias->setText(ui->labelActDias->text().arg(numDias));
    ui->labelActAsociaciones->setText(ui->labelActAsociaciones->text().arg(numAsociaciones));
}

void AcolitoInforme::evaluaBebidas()
{
    int numVentas;
    float importeTotal;
    int numProductos;
    int numPales;

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        // Calcula el total de ventas realizadas
        query.exec("SELECT count(*) from ventas");

        query.first();

        numVentas=query.value(0).toInt();

        query.clear();

        //Calcula el importe total
        query.exec("SELECT sum(precioVenta) FROM ventas");

        query.first();

        importeTotal=query.value(0).toFloat();

        query.clear();

        //Calcula el numero de productos totales a la venta

        query.exec("SELECT count(*) from producto");

        query.first();

        numProductos=query.value(0).toInt();

        query.clear();

        //Calcula el numero de pales abiertos

        query.exec("SELECT count(*) from pales");

        query.first();

        numPales=query.value(0).toInt();

        query.clear();
    }

    ui->labelBebidas1->setText(ui->labelBebidas1->text().arg(numVentas).arg(importeTotal).arg(numProductos).arg(numPales));
    ui->labelProductos->setText(ui->labelProductos->text().arg(numProductos));
    ui->labelPales->setText(ui->labelPales->text().arg(numPales));
    ui->labelVentas->setText(ui->labelVentas->text().arg(numVentas));
}

void AcolitoInforme::datosEvento()
{
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT nombreEvento,inicio,fin from evento");

        query.first();

        ui->labelEvento->setText(query.value(0).toString());
        ui->calendarWidget->setDateRange(query.value(2).toDate(),query.value(1).toDate());
    }
}
